package org.bluedream.core.module.base;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.bluedream.comm.base.BaseServiceImpl;
import org.bluedream.comm.utils.EmptyUtil;
import org.bluedream.comm.utils.ReflexUtil;
import org.bluedream.core.utils.UserUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.Map;

@Transactional(
        readOnly = true
)
public class OrgBaseServiceImpl<M extends BaseMapper<T>, T> extends BaseServiceImpl<M , T> {
    protected Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    @Transactional(
            readOnly = false,
            rollbackFor = Exception.class
    )
    public boolean save(T entity) {
        boolean flag = ReflexUtil.isField("orgCode" , entity);
        if (ReflexUtil.isField("orgCode" , entity) &&
                EmptyUtil.isEmpty(ReflexUtil.getFieldValue(entity , "orgCode"))){
            ReflexUtil.setFieldValue(entity , "orgCode" , UserUtil.getLoginOrgCode());
        }
        return super.save(entity);
    }


/*    *//**
     * 封装findPage
     * @param entity
     * @param search  Map中的key：";"为保留关键字，拆分数组，仅支持最大长度2的数组，
     *                下标0：QueryWrapper查询条件中的列名(支持多表关联查询的表别名 + 列名方式，需要dao层接口支持)
     *                下标1： QueryWrapper中不同的查询条件，eq：等于，ge：大于等..... todo：请自行完善Mybatis eq、ne、gt、lt、ge、le等
     *                Map中的value：QueryWrapper需要查询的值
     * @param args  QueryWrapper中order by 排序数组
     * @return
     *//*
    public IPage<T> findPage(T entity , Map<String , Object> search , boolean isAddTableName , String... args){
        setLoginOrgCode2SearchMap(entity , search , isAddTableName);
        return super.findPage(entity , search , args);
    }*/

    /**
     * 封装findPage
     * @param entity
     * @param search  Map中的key：";"为保留关键字，拆分数组，仅支持最大长度2的数组，
     *                下标0：QueryWrapper查询条件中的列名(支持多表关联查询的表别名 + 列名方式，需要dao层接口支持)
     *                下标1： QueryWrapper中不同的查询条件，eq：等于，ge：大于等..... todo：请自行完善Mybatis eq、ne、gt、lt、ge、le等
     *                Map中的value：QueryWrapper需要查询的值
     * @param args  QueryWrapper中order by 排序数组
     * @return
     */
    public IPage<T> findPage(T entity , boolean isAddTableName , Map<String , Object> search , String... args){
        Map<String , Object> map = EmptyUtil.isNoEmpty(search)?search:new HashMap<>();
        setLoginOrgCode2SearchMap(entity , search , isAddTableName);
        if (EmptyUtil.isEmpty(search)){
            Long limit = (Long)ReflexUtil.getFieldValue(entity , "limit");
            Long page = (Long)ReflexUtil.getFieldValue(entity , "page");
            entity = (T) ReflexUtil.newInstance(entity.getClass() , limit , page);
        }
        return super.findPage(entity , search , args);
    }

    public IPage<T> findPage(T entity ,  Map<String , Object> search , String... args){
        Map<String , Object> map = EmptyUtil.isNoEmpty(search)?search:new HashMap<>();
        if (EmptyUtil.isEmpty(search)){
            Long limit = (Long)ReflexUtil.getFieldValue(entity , "limit");
            Long page = (Long)ReflexUtil.getFieldValue(entity , "page");
            entity = (T) ReflexUtil.newInstance(entity.getClass() , limit , page);
        }
        return super.findPage(entity , search , args);
    }

    private void setLoginOrgCode2SearchMap(T entity , Map<String , Object> search , boolean isAddTableName){
        String searchKey = "org_code;eq";
        if (isAddTableName){
            String tableName = entity.getClass().getSimpleName();
            searchKey = tableName + "." + searchKey;
        }
        search.put(searchKey , UserUtil.getLoginOrgCode());
    }

}
